// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_
#define MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_

#include <stddef.h>
#include <stdint.h>

#include <sstream>
#include <string>
#include <vector>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"

namespace media {
class AudioDecoderConfig;
class StreamParserBuffer;
class VideoDecoderConfig;

namespace mp2t {
    class EsParser;

    class EsParserTestBase {
    public:
        struct Packet {
            Packet();

            // Offset in the stream.
            size_t offset;

            // Size of the packet.
            size_t size;

            // Timestamp of the packet.
            base::TimeDelta pts;
        };

        EsParserTestBase();
        virtual ~EsParserTestBase();

    protected:
        void LoadStream(const char* filename);
        std::vector<Packet> LoadPacketsFromFiles(const char* file_temp, size_t num);

        // ES parser callbacks.
        void NewAudioConfig(const AudioDecoderConfig& config);
        void NewVideoConfig(const VideoDecoderConfig& config);
        void EmitBuffer(scoped_refptr<StreamParserBuffer> buffer);

        // Process the PES packets using the given ES parser.
        // When |force_timing| is true, even the invalid negative timestamps will be
        // given to the ES parser.
        // Return true if successful, false otherwise.
        bool ProcessPesPackets(EsParser* es_parser,
            const std::vector<Packet>& pes_packets,
            bool force_timing);

        // Assume the offsets are known, compute the size of each packet.
        // The last packet is assumed to cover the end of the stream.
        // Packets are assumed to be in stream order.
        void ComputePacketSize(std::vector<Packet>* packets);

        // Generate some fixed size PES packets of |stream_|.
        std::vector<Packet> GenerateFixedSizePesPacket(size_t pes_size);

        // ES stream.
        std::vector<uint8_t> stream_;

        // Number of decoder configs received from the ES parser.
        size_t config_count_;

        // Number of buffers generated while parsing the ES stream.
        size_t buffer_count_;

        // Timestamps of buffers generated while parsing the ES stream.
        std::string buffer_timestamps_;

    private:
        // Timestamps of buffers generated while parsing the ES stream.
        std::stringstream buffer_timestamps_stream_;

        DISALLOW_COPY_AND_ASSIGN(EsParserTestBase);
    };

} // namespace mp2t
} // namespace media

#endif // MEDIA_FORMATS_MP2T_ES_PARSER_TEST_BASE_H_
